#ifndef IPC_RENDER_H
#define IPC_RENDER_H

#include "capi/cef_values_capi.h"
#include "capi/cef_process_message_capi.h"
#include "capi/cef_browser_capi.h"
#include "capi/cef_v8_capi.h"

#include "tools/hash_map.h"
#include "ipc/ipc_common.h"
#include "tools/log_util.h"
#include "logger.h"

extern HashMap *ipcRenderer_handler_map;  // 渲染进程事件处理器
extern HashMap *ipcRenderer_callback_map; // 渲染进程回调函数

// V8处理器：处理JS的ipcRenderer.on调用
static int ipc_renderer_on_handler(
    cef_v8_handler_t *self,
    const cef_string_t *name, //  被调用的 JavaScript 函数名称。用于区分处理程序绑定的多个不同函数（若支持多函数处理）
    cef_v8_value_t *object,    // JavaScript 函数调用时的 this 对象（接收者)
    size_t argumentsCount,    // 传递给函数的参数个数。用于遍历 arguments 数组时确定边界
    struct _cef_v8_value_t *const *arguments, // 指向参数值数组的指针
    cef_v8_value_t **retval,    // 输出参数，用于设置函数的返回值。若执行成功，需通过 *retval = return_value 赋值，其中 return_value 是 cef_v8_value_t* 类型
    cef_string_t *exception);


// V8处理器：处理JS的ipcRenderer.send调用
static int ipc_renderer_send_handler(
    cef_v8_handler_t *self,
    const cef_string_t *name, //  被调用的 JavaScript 函数名称。用于区分处理程序绑定的多个不同函数（若支持多函数处理）
    cef_v8_value_t *object,    // JavaScript 函数调用时的 this 对象（接收者)
    size_t argumentsCount,    // 传递给函数的参数个数。用于遍历 arguments 数组时确定边界
    struct _cef_v8_value_t *const *arguments, // 指向参数值数组的指针
    cef_v8_value_t **retval,    // 输出参数，用于设置函数的返回值。若执行成功，需通过 *retval = return_value 赋值，其中
                               // return_value 是 cef_v8_value_t* 类型
    cef_string_t *exception);


// 将ipcRenderer绑定到JS全局对象
void bind_ipc_renderer(cef_v8_context_t *context);

// 处理主进程发来的消息
int handle_main_to_renderer_msg(cef_browser_t *browser, cef_frame_t *frame, cef_process_message_t *message);



#endif